package server.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import model.Usuario;
import server.exception.DAOException;
import server.exception.ServiceException;

public class AmigosDAO{
	private static Connection conexion;
	
	public AmigosDAO(){
		if(AmigosDAO.conexion == null)
			AmigosDAO.conexion = ConexionDAO.getInstance();
	}

	/**
	 * Obtiene una lista con los amigos de un usuario esten o no conectados
	 * 
	 * @param usuario
	 *            Usuario del cual se desea saber sus amistades
	 * @return Lista con los amigos del usuario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 */
	public ArrayList<Usuario> amigosDe(Usuario usuario) throws DAOException {	
		ArrayList<Usuario> listaAmigos = new ArrayList<Usuario>();
		try {
			Statement st = conexion.createStatement();
			
			String sql = "SELECT b.* "+
						 "FROM AMIGOS a, USUARIOS b "+
						 "WHERE a.id_user = " + usuario.getId() +
						 " AND a.id_amigo = b.id " +
						 " AND NOT EXISTS(SELECT 1 " +
						 "				  FROM BLOQUEADOS c " +
						 "				  WHERE c.id_usuario = b.id "  +
						 "				  AND c.id_usuario_bloqueado = 	"+	usuario.getId() + ") " +
						 "UNION " + 
						 "SELECT a.* "+
						 "FROM AMIGOS b, USUARIOS a "+
						 "WHERE b.id_amigo = " + usuario.getId() +
						 " AND a.id = b.id_user " + 
						 " AND NOT EXISTS(SELECT 1 " +
						 "				  FROM BLOQUEADOS c " +
						 "				  WHERE c.id_usuario = a.id "  +
						 "				  AND c.id_usuario_bloqueado = 	"+	usuario.getId() + ") ;";
			
			ResultSet rs = st.executeQuery(sql);
			while (rs.next()) {
				Usuario amigo = new Usuario(rs.getInt("id"), rs.getString("nick"),rs.getString("password"),
											rs.getString("nombre"),rs.getString("apellido"),
											rs.getString("pregunta_secreta"),rs.getString("respuesta_secreta"));
				if(amigo != null)
					listaAmigos.add(amigo);
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			//throw new DAOException("No se pudo realizar la accion", e);
		}
		return listaAmigos;
	}
	
	
	
	/**
	 * Envia una solicitud de amistad
	 * 
	 * @param invitador
	 *            Usuario que realiza la solicitud de amistad
	 * @param invitado
	 *            Usuario invitado
	 */
	public boolean solicitudDeAmistad(Usuario invitador, Usuario invitado) {
	try{
		String insertAmistad = "INSERT INTO REPOSITORIO "+
								"values(?,?);";
		PreparedStatement st = conexion.prepareStatement(insertAmistad);

		st.setInt(1,invitado.getId());
		st.setInt(2,invitador.getId());
		st.executeUpdate();
		
		conexion.commit();
		return true;
		
	}catch(Exception e){
		return false;
		
	}
	
	}
	
	
	/**
	 * Acepta una solicitud de amistad
	 * 
	 * @param invitador
	 *            Usuario que realiza la solicitud de amistad
	 * @param invitado
	 *            Usuario invitado
	 */
	public boolean aceptarSolicitudDeAmistad(Usuario invitador, Usuario invitado)throws DAOException {
	try{
		String deleteRepo = "DELETE FROM REPOSITORIO "+
								"WHERE id_origen = ? AND id_destino = ?;";
		PreparedStatement st = conexion.prepareStatement(deleteRepo);

		st.setInt(1,invitador.getId());
		st.setInt(2,invitado.getId());
		st.executeUpdate();
		
	
		
		
		String insertAmistad = "INSERT INTO amigos values(?,?);";
		st = conexion.prepareStatement(insertAmistad);
		
		st.setInt(1,invitado.getId());
		st.setInt(2,invitador.getId());
		st.executeUpdate();
		

		return true;
		
	}catch(Exception e){
		return false;
	}
	
	}
	
	/**
	 * Elimina una amistad entre 2 usuarios
	 * 
	 * @param eliminador
	 *            Usuario que quiere eliminar la amistad
	 * @param eliminado
	 *            Usuario victima de la eliminacion
	 * @return verdadero en caso de exito, falso en caso contrario
	 * @throws ServiceException
	 *             en caso de que no se pueda completar la accion
	 */
	public boolean eliminar(Usuario eliminador, Usuario eliminado)
			throws DAOException {
	try{
		String deleteAmistad = "DELETE FROM AMIGOS "+
								"WHERE (id_amigo = ?  AND id_user = ? ) " +
								"OR ( id_amigo = ?  AND id_user = ? ) ;";
		
		PreparedStatement st = conexion.prepareStatement(deleteAmistad);

		st.setInt(1,eliminado.getId());
		st.setInt(2,eliminador.getId());
		st.setInt(3,eliminador.getId());
		st.setInt(4,eliminado.getId());
		
		st.executeUpdate();

		return true;
		
	}catch(Exception e){
		throw new DAOException("No se pudo realizar la accion", e);
	}
	
	}

	public boolean bloquear(Usuario bloqueador, Usuario bloqueado) throws DAOException {
		try{
			String deleteAmistad = "INSERT INTO BLOQUEADOS (id_usuario, id_usuario_bloqueado) " +
								   "VALUES(?, ?);";
			
			PreparedStatement st = conexion.prepareStatement(deleteAmistad);

			st.setInt(1,bloqueador.getId());
			st.setInt(2,bloqueado.getId());
			
			st.executeUpdate();

			return true;
			
		}catch(Exception e){
			throw new DAOException("No se pudo realizar la accion", e);
		}
	}


	public ArrayList<Usuario> amigosEnComun(Usuario usuario, Usuario otroUsuario) throws DAOException {
		ArrayList<Usuario> listaAmigosUsuario = amigosDe(usuario);
		ArrayList<Usuario> listaAmigosOtroUsuario = amigosDe(otroUsuario);
		
		//Borra de la lista de amigos, los que no esten
		//en los amigos del otro usuario
		listaAmigosUsuario.retainAll(listaAmigosOtroUsuario);
		
		//Devuelvo la lista filtrada
		return listaAmigosUsuario;
	}	


	public static void main(String[] args) throws Exception{
		AmigosDAO am = new AmigosDAO();
		Usuario usuario = new Usuario();
		usuario.setId(33);
		ArrayList<Usuario> lista = am.amigosDe(usuario);
		for(Usuario u:lista)
			System.out.println(u.getId());
	}
}
